#include "server.h"
#include <stdio.h>
#include <string.h>
#include <dirent.h>

int handle_ls(ServerInfo* server, int client_index, const char* path) {
    ClientInfo* client = &server->clients[client_index];
    Message response;
    // 声明目录指针和目录项结构体
    DIR* dir;
    struct dirent* entry;
    // 创建一个缓冲区来存储目录列表，初始化为全0
    char list_buffer[1024] = {0};
    // 用于跟踪缓冲区中的当前位置
    int offset = 0;

    // 打开指定路径的目录，如果path为空则打开当前目录
    dir = opendir(path[0] ? path : ".");
    if (dir == NULL) {
        // 如果无法打开目录，设置响应类型为失败
        response.type = MSG_TYPE_FAIL;
        // 将错误信息写入响应数据
        response.length = snprintf(response.data, sizeof(response.data), "无法打开目录: %s", path);
    } else {
        // 成功打开目录，设置响应类型为成功
        response.type = MSG_TYPE_SUCCESS;
        // 读取目录中的每一个条目
        while ((entry = readdir(dir)) != NULL) {
            // 将每个条目的名称添加到list_buffer中，每个名称后加换行符
            offset += snprintf(list_buffer + offset, sizeof(list_buffer) - offset, "%s\n", entry->d_name);
            // 如果缓冲区已满，停止读取
            if (offset >= sizeof(list_buffer) - 1) break;
        }
        // 关闭目录
        closedir(dir);
        // 将list_buffer的内容复制到响应数据中
        response.length = snprintf(response.data, sizeof(response.data), "%s", list_buffer);
    }

    // 发送响应消息给客户端
    if (send_message(client->socket, &response) < 0) {
        // 如果发送失败，打印错误信息并返回-1
        perror("发送ls响应失败");
        return -1;
    }

    return 0;
}